package com.netty.server;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.codec.LengthFieldPrepender;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.util.CharsetUtil;

/**
 * 主要是通过ch获取到PipeLine来添加处理器
 * ChannelPipeline类是ChannelHandler实例对象的链表，用于处理或截获通道的接收和发送数据，
 * 每个新的通道Channel，都会创建一个新的ChannelPipeline，并将器pipeline附加到channel中。
 *
 * 通常会为新SocketChannel通过添加一些handler，来设置ChannelPipeline。
 */
public class MyServerInitializer extends ChannelInitializer<SocketChannel> {
    /**
     *  ch就可以对channel进行设置
     */
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        //ChannelPipeline类是ChannelHandler实例对象的链表，用于处理或截获通道的接收和发送数据
        ChannelPipeline pipeline = ch.pipeline();
        // 也可以选择将处理器加到pipeLine的那个位置
        //一些限定和编码解码器
        pipeline.addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));
        pipeline.addLast(new LengthFieldPrepender(4));
        pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8));
        pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8));
        pipeline.addLast(new MyServerHandler());
    }

}
